#include <jni.h>
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

/*
 * Class:     com_yf_jnic2java_Jni
 * Method:    callNVoid
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_yf_jnic2java_Jni_callNVoid
  (JNIEnv* env, jobject thiz) {
	// 1.找到字节码
	jclass clazz = (*env)->FindClass(env, "com/yf/jnic2java/Jni");
	// 2.找到方法
	jmethodID methodID = (*env)->GetMethodID(env, clazz, "helloJava", "()V");
	// 3.创建对象(如果native方法和要回调的方法在同一个Java类中，就不用创建对象，直接使用传进来jobject)
	// 4.调用方法
	(*env)->CallVoidMethod(env, thiz, methodID);
}

/*
 * Class:     com_yf_jnic2java_Jni
 * Method:    callNInt
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_yf_jnic2java_Jni_callNInt
  (JNIEnv* env, jobject thiz) {
	// 1.找到字节码
	jclass clazz = (*env)->FindClass(env, "com/yf/jnic2java/Jni");
	// 2.找到方法
	jmethodID methodID = (*env)->GetMethodID(env, clazz, "add", "(II)I");
	// 3.创建对象(如果native方法和要回调的方法在同一个Java类中，就不用创建对象，直接使用传进来jobject)
	// 4.调用方法
	int sum = (*env)->CallIntMethod(env, thiz, methodID, 3, 4);
	LOGD("sum=%d", sum);
}

/*
 * Class:     com_yf_jnic2java_Jni
 * Method:    callNStr
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_yf_jnic2java_Jni_callNStr
  (JNIEnv* env, jobject thiz) {
	// 1.找到字节码
	jclass clazz = (*env)->FindClass(env, "com/yf/jnic2java/Jni");
	// 2.找到方法
	jmethodID methodID = (*env)->GetMethodID(env, clazz, "printStr", "(Ljava/lang/String;)V");
	// 3.创建对象(如果native方法和要回调的方法在同一个Java类中，就不用创建对象，直接使用传进来jobject)
	// 4.调用方法
	jstring jstr = (*env)->NewStringUTF(env, "hello jstr");
	(*env)->CallVoidMethod(env, thiz, methodID, jstr);
}
